package co.kr.bettersoft.carrotmerchantmobile.activity;
/**
 * MainHome
 * 메인 1. 홈 화면.
 * 
 * 홈1, 홈2, 홈3 으로 구성됨.
 *   홈1에는 적립, 조회 버튼이 있어서 홈2(적립), 홈3(조회) 화면으로 이동 가능
 *   홈2에는 적립 모드 - QR 스켄해서 적립하는 화면
 *   홈3에는 조회 모드 - QR 스켄해서 사용하는 화면
 */
import java.text.DecimalFormat;

import org.json.JSONException;
import org.json.JSONObject;

import co.kr.bettersoft.carrotmerchantmobile.common.CarrotMerchantMobileRest;
import co.kr.bettersoft.carrotmerchantmobile.common.CommonConstant;
import co.kr.bettersoft.carrotmerchantmobile.domain.CheckMileageMileage;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainHome extends Activity {
	String TAG = "MainHome";

	final int CHECK_MILEAGE_EXIST = 201;
	final int REGISTER_MILEAGE = 202;
	final int REGISTER_CASH_MILEAGE = 203;
	final int UPDATE_MILEAGE = 204;
	
	int app_end = 0;	// 뒤로가기 버튼으로 닫을때 2번만에 닫히도록

	// 전달받은 가맹점 정보
	static String merchantId;
	static String countryCode;
	static String languageCode;

	// 유저 정보 
	String userID = "";				//QR 스캔한 유저 아이디
	String userMileage = "0";		// 유저 마일리지 값
	String carrotAmount = "";		// 가맹점에서 입력한   결재 금액/이용 금액
	
	CarrotMerchantMobileRest carrotMerchantMobileRest;
	String callResult = "";
	String tempstr = "";
	JSONObject jsonObject;
	
	View homeLayout1, homeLayout2, homeLayout3;		// 홈 레이아웃. 홈화면 1,2,3
	// 홈 화면 1.  적립,조회 버튼.
	Button  homeSaveMileageBtn1, homeInquiryMileageBtn1;			// 홈 적립 버튼, 조회 버튼
	// 홈 화면 2.  적립 화면.
	Button qrScan2, saveCarrotBtn2, saveCarrotCashBtn2, closeBtn2;
	TextView myCarrotAmount2;
	EditText saveCarrotAmount2;
	// 홈 화면 3.  조회(및 사용) 화면.
	Button qrScan3, useCarrotBtn3, closeBtn3;
	TextView myCarrotAmount3;
    EditText useCarrotAmount3;
    // 진행바
	ProgressBar pb1;		// 중단 로딩 진행바
	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;		// 키보드 제어

	
	// 세자리마다 콤마
	DecimalFormat df = new DecimalFormat("###,###");
	  // 값 셋팅시, StackOverFlow를 막기 위해서, 바뀐 변수를 저장해준다.
	String result="";
	// 금액 9자리 넘지 않도록 설정하기 위한 임시변수
	String setMoney;
	
	int runMode = 1;				// 실행 모드.  1=홈. 2=적립모드. 3=소비모드

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기
					Toast.makeText(MainHome.this, b.getString("msg"), Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("init")==1){		//닫기 및 성공시 호출함::  적립용. 마일리지 값, 소비용 마일리지 값. 스캔한 아이디. 초기화 (아이디 값을 통해 진행 여부 체크하기 때문)
					myCarrotAmount2.setText("-");					// 적립 화면. 고객 마일리지
					saveCarrotAmount2.setText("");					// 적립 화면. 적립 금액
					myCarrotAmount3.setText("-");					// 소비 화면. 고객 마일리지
					useCarrotAmount3.setText("");					// 소비 화면. 소비 금액
					userID = "";									// 스캔한 고객 아이디 
				}
				if(b.getInt("goHomeMain")==1){		// 홈1 로
					init();			// 이전값 초기화.
					hideKeyboard();
					homeLayout1.setVisibility(View.VISIBLE);
					homeLayout2.setVisibility(View.GONE);
					homeLayout3.setVisibility(View.GONE);
					myCarrotAmount2.setVisibility(View.GONE);		// 함께 사라지지 않기 때문에 별도 처리
					myCarrotAmount3.setVisibility(View.GONE);		// 함께 사라지지 않기 때문에 별도 처리
				}
				if(b.getInt("showMileage")==1){		// 적립용. 고객 마일리지 화면에 표시
					hidePb();
					myCarrotAmount2.setText(userMileage);
				}else if(b.getInt("showMileage")==2){		// 소비용. 고객 마일리지 화면에 표시
					hidePb();
					myCarrotAmount3.setText(userMileage);
				}
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					//
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant. alertTitle )                                        // *** "Carrot" 하드코딩 --> 변수사용 
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("showConfirm")==2){						// 확인창. 마일리지 적립 확인. yn
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant. alertTitle )                                        		
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)
					.setCancelable(true)
					.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							handler.sendEmptyMessage(REGISTER_MILEAGE);
						}
					})
					.setNegativeButton(getString(R.string.no), null)		 
					.show();
				}else if(b.getInt("showConfirm")==3){				// 확인창. 마일리지 소비 확인. yn
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant. alertTitle )                                        	
					.setIcon(R.drawable.ic_dialog_img)
					.setMessage(b.getString("msg"))
					.setCancelable(true)
					.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							handler.sendEmptyMessage(UPDATE_MILEAGE);
						}
					})
					.setNegativeButton(getString(R.string.no), null)		 
					.show();
				}else if(b.getInt("showConfirm")==4){						// 확인창. 마일리지 적립 확인. yn  // cash
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant. alertTitle )                                        	
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)
					.setCancelable(true)
					.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							handler.sendEmptyMessage(REGISTER_CASH_MILEAGE);
						}
					})
					.setNegativeButton(getString(R.string.no), null)		 
					.show();
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.main_home_progressbar1);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.main_home_progressbar1);
					}
					pb1.setVisibility(View.GONE);
				}
				
				switch (msg.what)
				{
				case CHECK_MILEAGE_EXIST   : runOnUiThread(new RunnableCheckMileageExist());		
				break;
				case REGISTER_MILEAGE   : runOnUiThread(new RunnableRegisterMileage());		
				break;	
				case REGISTER_CASH_MILEAGE   : runOnUiThread(new RunnableRegisterCashMileage());		
				break;
				case UPDATE_MILEAGE   : runOnUiThread(new RunnableUpdateMileage());		
				break;
				default : 
					break;
				}		
				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.main_home);

		carrotMerchantMobileRest = new CarrotMerchantMobileRest();
		
		// 레이아웃.
		homeLayout1 = findViewById(R.id.main_home_layout1);
		homeLayout2 = findViewById(R.id.main_home_layout2);
		homeLayout3 = findViewById(R.id.main_home_layout3);

		// 홈1 화면 -- 적립버튼, 조회 버튼
		homeSaveMileageBtn1 = (Button) findViewById(R.id.main_home1_save_btn);
		homeInquiryMileageBtn1 = (Button) findViewById(R.id.main_home1_inquiry_btn);
		// 홈2 화면 -- QR 스캔버튼, 내 마일리지, 결재금액(적립용), 적립버튼, 닫기 버튼
		qrScan2 = (Button) findViewById(R.id.main_home2_qrscan_btn);
		myCarrotAmount2 = (TextView) findViewById(R.id.main_home2_mycarrot_amount);
		saveCarrotAmount2 = (EditText) findViewById(R.id.main_home2_savecarrot_amount);
		saveCarrotBtn2 = (Button) findViewById(R.id.main_home2_savecarrot_btn);
		saveCarrotCashBtn2 = (Button) findViewById(R.id.main_home2_savecarrot_cash_btn);
		closeBtn2 = (Button) findViewById(R.id.main_home2_close_btn);
		// 홈3 화면 -- QR 스캔버튼, 내 마일리지, 사용할캐럿(사용), 사용버튼, 닫기 버튼
		qrScan3 = (Button) findViewById(R.id.main_home3_qrscan_btn);
		myCarrotAmount3 = (TextView) findViewById(R.id.main_home3_mycarrot_amount);
		useCarrotAmount3 = (EditText) findViewById(R.id.main_home3_usecarrot_amount);
		useCarrotBtn3 = (Button) findViewById(R.id.main_home3_usecarrot_btn);
		closeBtn3 = (Button) findViewById(R.id.main_home3_close_btn);
		
		// 결재금액 3자리마다 콤마(,)를 넣는다.
		saveCarrotAmount2.addTextChangedListener(new TextWatcher(){
            @Override
            public void afterTextChanged(Editable s) {}
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            	// 자리수 검사
            	setMoney = saveCarrotAmount2.getText()+"";
            	if(checkAndSetMoney1()){
            		// 3자리마다 콤마
                    if((!s.toString().equals(""))&&(!s.toString().equals(result))){     // StackOverflow를 막기위해, "" 될때 에러 방지
                       result = df.format(Long.parseLong(s.toString().replaceAll(",", "")));   // 에딧텍스트의 값을 변환하여, result에 저장.
                       saveCarrotAmount2.setText(result);    // 결과 텍스트 셋팅.
                       saveCarrotAmount2.setSelection(result.length());     // 커서를 제일 끝으로 보냄.
                   }     
            	}
            }
        }); 
		useCarrotAmount3.addTextChangedListener(new TextWatcher(){
            @Override
            public void afterTextChanged(Editable s) {}
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            	// 자리수 검사
                setMoney = useCarrotAmount3.getText()+"";
                if(checkAndSetMoney2()){
                	// 3자리마다 콤마
                    if((!s.toString().equals(""))&&(!s.toString().equals(result))){     // StackOverflow를 막기위해, "" 될때 에러 방지
                       result = df.format(Long.parseLong(s.toString().replaceAll(",", "")));   // 에딧텍스트의 값을 변환하여, result에 저장.
                       useCarrotAmount3.setText(result);    // 결과 텍스트 셋팅.
                       useCarrotAmount3.setSelection(result.length());     // 커서를 제일 끝으로 보냄.
                   }     
                }
            }
        }); 
		
		/*
		 * 에딧 텍스트 입력창 더블탭 방지
		 */
		final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
		    public boolean onDoubleTap(MotionEvent e) {
//		        Log.e("", "Open new activty here");
		        return true;
		    }
		});
		saveCarrotAmount2.setOnTouchListener(new OnTouchListener() {
		    public boolean onTouch(View v, MotionEvent event) {
		        return gestureDetector.onTouchEvent(event);
		    }
		});
		useCarrotAmount3.setOnTouchListener(new OnTouchListener() {
		    public boolean onTouch(View v, MotionEvent event) {
		        return gestureDetector.onTouchEvent(event);
		    }
		});

		// 홈1화면 적립버튼, 조회 버튼 리스너
		homeSaveMileageBtn1.setOnClickListener(new OnClickListener() {		// 홈1. 적립버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"homeSaveMileageBtn click");
				runMode = 2;		// 적립 모드
				homeLayout1.setVisibility(View.GONE);
				homeLayout2.setVisibility(View.VISIBLE);
				myCarrotAmount2.setVisibility(View.VISIBLE);
			}
		});
		homeInquiryMileageBtn1.setOnClickListener(new OnClickListener() {	// 홈1. 조회버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"homeInquiryMileageBtn click");
				runMode = 3; 		// 조회/소비 모드
				homeLayout1.setVisibility(View.GONE);
				homeLayout3.setVisibility(View.VISIBLE);
				myCarrotAmount3.setVisibility(View.VISIBLE);
			}
		});
		// 홈2화면 스캔버튼, 적립버튼, 닫기버튼 리스너
		qrScan2.setOnClickListener(new OnClickListener() {		// 홈2. QR스캔버튼
			@Override
			public void onClick(View v) {
				//				Log.w(TAG,"qrScan2 click");
				Intent intent = new Intent(MainHome.this,com.google.zxing.client.android.CaptureActivity.class);
				intent.setPackage("com.google.zxing.client.android");		 
				try{
					startActivityForResult(intent, 1);
				}catch(Exception e){
					//					e.printStackTrace();
					Log.i("MainHome", "error occured");
				}
			}
		});
		saveCarrotBtn2.setOnClickListener(new OnClickListener() {		// 홈2. 캐럿적립 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"saveCarrotBtn2 click");
				hideKeyboard();
				carrotAmount = saveCarrotAmount2.getText()+"";
				if(userID.length()<1){
					showResultDialog(getString(R.string.scan_your_qr_code));						// "고객님의 QR코드를 스캔하여 주십시오."		
				}else{
					if(carrotAmount.length()<1){
						showResultDialog(getString(R.string.input_pay_amount));							// "결재 금액을 입력해 주십시오."
					}else{
						if(carrotAmount.length()>0){
							carrotAmount = removeComma(carrotAmount);	// 콤마 제거					
							carrotAmount = Integer.toString(Integer.parseInt(carrotAmount));
						}
						if(carrotAmount.length()<1 || (carrotAmount.equals("0"))){
							showResultDialog(getString(R.string.input_pay_amount));							// "결재 금액을 입력해 주십시오."
						}else{
							showConfirmDialog(2, getString(R.string.confirm_carrot_save));		// 캐럿을 적립하시겠습니까?. 카드적립은 2
						}
					}
				}
			}
		});
		saveCarrotCashBtn2.setOnClickListener(new OnClickListener() {		// 홈2. 캐럿적립 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"saveCarrotCashBtn2 click");
				hideKeyboard();
				carrotAmount = saveCarrotAmount2.getText()+"";
				if(userID.length()<1){
					showResultDialog(getString(R.string.scan_your_qr_code));						// "고객님의 QR코드를 스캔하여 주십시오."		
				}else{
					if(carrotAmount.length()>0){
						carrotAmount = removeComma(carrotAmount);	// 콤마 제거					
						carrotAmount = Integer.toString(Integer.parseInt(carrotAmount));
					}
					if(carrotAmount.length()<1 || (carrotAmount.equals("0"))){
						showResultDialog(getString(R.string.input_pay_amount));							// "결재 금액을 입력해 주십시오."
					}else{
						showConfirmDialog(4, getString(R.string.confirm_carrot_save));		// 캐럿을 적립하시겠습니까? . 현금적립은 4
					}
				}
			}
		});
		
		closeBtn2.setOnClickListener(new OnClickListener() {		// 홈2. 닫기 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"closeBtn2 click");
				runMode = 1; 	// 홈 모드
				goHomeMain();
				//				init();			// 이전값 초기화.
				//				hideKeyboard();
				//				homeLayout1.setVisibility(View.VISIBLE);
				//				homeLayout2.setVisibility(View.GONE);
			}
		});
		// 홈3화면 스캔버튼, 사용버튼, 닫기버튼 리스너
		qrScan3.setOnClickListener(new OnClickListener() {		// 홈3. QR스캔 버튼
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MainHome.this,com.google.zxing.client.android.CaptureActivity.class);
				intent.setPackage("com.google.zxing.client.android");
				try{
					startActivityForResult(intent, 2);
				}catch(Exception e){
					Log.i("MainHome", "error occured");
				}
			}
		});
		useCarrotBtn3.setOnClickListener(new OnClickListener() {		// 홈3. 캐럿사용 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"useCarrotBtn3 click");
				hideKeyboard();									// 키보드 숨김
				carrotAmount = useCarrotAmount3.getText()+"";

				if(userID.length()<1){
					showResultDialog(getString(R.string.scan_your_qr_code));			// 고객님의 QR코드를 스캔하여 주십시오.
				}else{
					if(carrotAmount.length()>0){
						carrotAmount = removeComma(carrotAmount);	// 콤마 제거	
						carrotAmount = Integer.toString(Integer.parseInt(carrotAmount));	// 숫자를 문자로
					}
					if(carrotAmount.length()<1 || (carrotAmount.equals("0"))){
						showResultDialog(getString(R.string.input_use_amount));  		// 사용할 마일리지를 입력해 주십시오.
					}else if(Integer.parseInt(carrotAmount) > Integer.parseInt(myCarrotAmount3.getText()+"")){		
						showResultDialog(getString(R.string.not_enough_mileage));  		// 마일리지가 부족합니다.
					}else{
						showConfirmDialog(3, getString(R.string.confirm_carrot_use));    // 캐럿을 사용하시겠습니까?
					}
				}
			}
		});
		closeBtn3.setOnClickListener(new OnClickListener() {		// 홈3. 닫기 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"closeBtn3 click");
				runMode = 1; 	// 홈 모드
				goHomeMain();		//홈으로.
			}
		});

		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도 
		parentLayout = findViewById(R.id.main_home_parent_layout);		
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.w(TAG,"parentLayout click");
				hideKeyboard();
			}
		});
	}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	
	// QR 스켄 결과 받는 부분
	/**
	 * onActivityResult
	 *   QR 스켄 결과 받아 처리한다
	 *
	 * @param requestCode
	 * @param resultCode
	 * @param intent
	 * @return
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, intent);
		if(requestCode == 1) {					// 적립용 스캔인 경우
			if(resultCode == RESULT_OK) {  		// 성공시
				userID = intent.getStringExtra("SCAN_RESULT");
				Log.d(TAG,"userID::"+userID);			
				if(userID.contains("http")){			// URL로 읽었을 경우. (아이폰에서 생성한 QR)
					userID = userID.substring(7);			// 앞의 http:// 을 자른다. (7글자)
				}
				Log.d(TAG,"userID::"+userID);			
				new backgroundCheckMileageExist().execute();	// 고객 정보  가져온다. 런모드(적립:2,조회:3) 에 따라 화면에 값을 보여준다. 
			} else if(resultCode == RESULT_CANCELED) {
				// 취소 또는 실패시 이전화면으로.
				Log.d(TAG,"canceled");
			}
		}
		if(requestCode == 2) {				// 조회용 스캔인 경우
			if(resultCode == RESULT_OK) {  // 성공시
				userID = intent.getStringExtra("SCAN_RESULT");
				Log.d(TAG,"userID::"+userID);			
				if(userID.contains("http")){			// URL로 읽었을 경우. (아이폰)
					userID = userID.substring(7);			// 앞의 http:// 을 자른다. (7글자)
				}
				Log.d(TAG,"userID::"+userID);	
				new backgroundCheckMileageExist().execute();	// 고객 정보  가져온다. 런모드(적립:2,조회:3) 에 따라 화면에 값을 보여준다. 
			} else if(resultCode == RESULT_CANCELED) {
				// 취소 또는 실패시 이전화면으로.
				Log.d(TAG,"canceled");
			}
		}
	}
	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// 금액 유효성 검사 후 세팅
	public Boolean checkAndSetMoney1(){
		if(setMoney.length()>11){	// 백, 캔슬 제외한 입력키가 아닐때 숫자 오버되면 경고창
//			Toast.makeText(MainActivityHome.this, "결재 금액이 너무 큽니다.", Toast.LENGTH_SHORT).show();
//			showResultDialog(getString(R.string.get_carrot_info_failed));
			saveCarrotAmount2.setText(setMoney.substring(0, setMoney.length()-1)); // ***	// 테스트 필요 
			showResultDialog(getString(R.string.too_many_nums));
			saveCarrotAmount2.setSelection((saveCarrotAmount2.getText()+"").length());	// *** 
			return false;
//			// myCarrotAmount2.getText().length()<1 &&  --> Toast.makeText(MainActivityHome.this, "먼저 고객님의 QR코드를 스켄해 주십시오.", Toast.LENGTH_SHORT).show();
		}else{
			return true;
//			saveCarrotAmount2.setText(setMoney);
		}
	}
	public Boolean checkAndSetMoney2(){
		if(setMoney.length()>11){	// 백, 캔슬 제외한 입력키가 아닐때 숫자 오버되면 경고창
			useCarrotAmount3.setText(setMoney.substring(0, setMoney.length()-1));
			showResultDialog(getString(R.string.too_many_nums));
			useCarrotAmount3.setSelection((useCarrotAmount3.getText()+"").length());	// *** 
			return false;
		}else{
			return true;
		}
	}
	//콤마 제거
	public String removeComma(String data){
		return data.replaceAll("\\,","");
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	

	/**
	 * 러너블. 고객 정보를 가져온다.
	 */
	class RunnableCheckMileageExist implements Runnable {
		public void run(){
			new backgroundCheckMileageExist().execute();
		}
	}
	/**
	 * backgroundCheckMileageExist
	 *  비동기로 고객 정보를 가져온다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundCheckMileageExist extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundCheckMileageExist");
			
			// 파리미터 세팅
			CheckMileageMileage checkMileageMileageParam = new CheckMileageMileage();
			checkMileageMileageParam.setCustomerId(userID);
			checkMileageMileageParam.setMerchantId(merchantId);
			// 호출
			showPb();
			callResult = carrotMerchantMobileRest.RestCheckMileageExist(checkMileageMileageParam);
			hidePb();
			// 결과 처리
			if(callResult.equals("S")){
				try {
					// 데이터 세팅부..
					tempstr = carrotMerchantMobileRest.getTempstr(); 
					jsonObject = new JSONObject(tempstr);
					JSONObject jsonobj2 = jsonObject.getJSONObject("checkMileageMileage");
					try{
						userMileage =jsonobj2.getString("mileage");
					}catch(Exception e){
						showResultDialog(getString(R.string.get_carrot_info_failed));			// 캐럿 조회에 실패하였습니다.\n 다시 시도해 주십시오.	
						//					showMsg("캐럿 조회에 실패하였습니다.\n 다시 시도해 주십시오.");
					}
					Log.d(TAG,"runMode::"+runMode);
					if(runMode==2){
						showCustomerMileageForSave();		// 화면에 마일리지 값 보여줌
					}else if(runMode==3){
						showCustomerMileageForUse();		// 화면에 마일리지 값 보여줌
					}
				} catch (JSONException e) {
					e.printStackTrace();
				} 
			}else{	
				showResultDialog(getString(R.string.request_failed));	
			}
			
			return null; 
		}
	}

	
	/**
	 * 러너블.마일리지를 적립한다.
	 */
	class RunnableRegisterMileage implements Runnable {
		public void run(){
			new backgroundRegisterMileage().execute();
		}
	}
	/**
	 * backgroundRegisterMileage
	 *  비동기로 마일리지를 적립한다.
	 * -- 카드
	 * @param 
	 * @param
	 * @return
	 */
	public class backgroundRegisterMileage extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundRegisterMileage");
			
			// 파리미터 세팅
			CheckMileageMileage checkMileageMileageParam = new CheckMileageMileage();
			checkMileageMileageParam.setCustomerId(userID);
			checkMileageMileageParam.setMerchantId(merchantId);
			checkMileageMileageParam.setMileage(userMileage);
			checkMileageMileageParam.setBill(carrotAmount);
			// 호출
			showPb();
			callResult = carrotMerchantMobileRest.RestRegisterMileage(checkMileageMileageParam);
			hidePb();
			// 결과 처리
			if(callResult.equals("SUCCESS")){
				showResultDialog(getString(R.string.carrot_save_success));					// 캐럿이 적립되었습니다.	
			}else{
				showResultDialog(getString(R.string.carrot_save_failed));		// 캐럿 적립에 실패하였습니다.\n 다시 시도해 주십시오.
			}
			init();
			
			return null; 
		}
	}
	
	/**
	 * 러너블. 현금 마일리지를  적립한다.
	 */
	class RunnableRegisterCashMileage implements Runnable {
		public void run(){
			new backgroundRegisterMileageCash().execute();
		}
	}
	/**
	 * backgroundRegisterMileageCash
	 * 비동기로 현금 마일리지를  적립한다.
	 *
	 * @param 
	 * @param 
	 * @return 
	 */
	public class backgroundRegisterMileageCash extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundRegisterMileageCash");
			// 파리미터 세팅
			CheckMileageMileage checkMileageMileageParam = new CheckMileageMileage();
			checkMileageMileageParam.setCustomerId(userID);
			checkMileageMileageParam.setMerchantId(merchantId);
			checkMileageMileageParam.setMileage(userMileage);
			checkMileageMileageParam.setBill(carrotAmount);
			// 호출
			showPb();
			callResult = carrotMerchantMobileRest.RestRegisterCashMileage(checkMileageMileageParam);
			hidePb();
			// 결과 처리
			if(callResult.equals("SUCCESS")){
				showResultDialog(getString(R.string.carrot_save_success));					// 캐럿이 적립되었습니다.	
			}else{
				showResultDialog(getString(R.string.carrot_save_failed));		// 캐럿 적립에 실패하였습니다.\n 다시 시도해 주십시오.
			}
			init();
			return null; 
		}
	}


	/**
	 * 러너블. 마일리지를 사용한다.
	 */
	class RunnableUpdateMileage implements Runnable {
		public void run(){
			new backgroundUpdateMileage().execute();
		}
	}
	/**
	 * backgroundUpdateMileage
	 * 비동기로 마일리지를 사용한다.
	 *
	 * @param 
	 * @param 
	 * @return 
	 */
	public class backgroundUpdateMileage extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundUpdateMileage");
			
			// 파리미터 세팅
			CheckMileageMileage checkMileageMileageParam = new CheckMileageMileage();
			checkMileageMileageParam.setCustomerId(userID);
			checkMileageMileageParam.setMerchantId(merchantId);
			checkMileageMileageParam.setMileage(userMileage);
			checkMileageMileageParam.setBill(carrotAmount);
			// 호출
			showPb();
			callResult = carrotMerchantMobileRest.RestUpdateMileage(checkMileageMileageParam);
			hidePb();
			// 결과 처리
			if(callResult.equals("SUCCESS")){
				showResultDialog(getString(R.string.carrot_use_success));				// 캐럿을 사용하였습니다.
			}else{
				showResultDialog(getString(R.string.carrot_use_failed));			// 캐럿 사용에 실패하였습니다.\n 다시 시도해 주십시오.
			}
			init();
			return null; 
		}
	}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	/**
	 * returnThis
	 *  컨택스트 리턴한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}

	/*
	 * 핸들러를 통한 작업.
	 */
	// 화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	/**
	 * showMsg
	 *  화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	 *
	 * @param msg
	 * @param
	 * @return
	 */
	public void showMsg(final String msg){			
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showToast", 1);
						b.putString("msg", msg);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 

	// 화면에 있는 고객 정보 초기화. 
	/**
	 * init
	 *  화면에 있는 고객 정보 초기화한다.
	 *
	 * @param 
	 * @param
	 * @return
	 */
	public void init(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("init", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * goHomeMain
	 *  홈1 로 이동한다.
	 *
	 * @param 
	 * @param
	 * @return
	 */
	public void goHomeMain(){		// 홈으로
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("goHomeMain", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	// 적립 모드. 고객 마일리지 값을 화면에 표시
	/**
	 * showCustomerMileageForSave
	 *  적립 모드. 고객 마일리지 값을 화면에 표시한다.
	 *
	 * @param 
	 * @param
	 * @return
	 */
	public void showCustomerMileageForSave(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showMileage", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	// 소비 모드. 고객 마일리지 값을 화면에 표시
	/**
	 * showCustomerMileageForUse
	 *  소비 모드. 고객 마일리지 값을 화면에 표시한다.
	 *
	 * @param 
	 * @param
	 * @return
	 */
	public void showCustomerMileageForUse(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showMileage", 2);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	// 키보드 숨김
	/**
	 * hideKeyboard
	 *  키보드 숨긴다.
	 *
	 * @param 
	 * @param
	 * @return 
	 */
	public void hideKeyboard(){
		imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE );
		imm .hideSoftInputFromWindow(saveCarrotAmount2 .getWindowToken(), 0);
	}

	/**
	 * showResultDialog
	 *  얼럿 띄운다
	 *
	 * @param msg
	 * @param
	 * @return 
	 */
	public void showResultDialog(final String msg){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 1);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showConfirmDialog
	 *  확인을 받는 컨펌 창을 띄운다
	 *
	 * @param showConfirmCode
	 * @param msg
	 * @return 
	 */
	public void showConfirmDialog(final int showConfirmCode, final String msg){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showConfirm", showConfirmCode);		// 2는 적립, 3은 소비
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}


	/*
	 *  닫기 버튼 2번 누르면 종료 됨.(non-Javadoc)
	 * @see android.app.Activity#onBackPressed()
	 */
	/**
	 * onBackPressed
	 *  닫기 버튼 2번 누르면 종료 한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onBackPressed() {
		Log.i("MainTabActivity", "finish");		
		if(runMode==1){
			if(app_end == 1){
				finish();
			}else{
				app_end = 1;
				Toast.makeText(MainHome.this, R.string.noti_back_finish, Toast.LENGTH_SHORT).show();
				new Thread( 
						new Runnable(){
							public void run(){
								try {
									Thread.sleep(3000);
									app_end = 0;
								} catch (InterruptedException e) {e.printStackTrace();}
							}
						}
				).start();
			}
		}else{
			goHomeMain();
			runMode = 1;
		}
	}

	/**
	 * onResume
	 *  액티비티 리쥼시 닫기 카운터초기화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onResume(){
		merchantId = MainTabs.merchantId;
		countryCode = MainTabs.countryCode;
		languageCode = MainTabs.languageCode;
		super.onResume();
		app_end = 0;
	}

}
